package pl.wroc.pwr.mss.server.ui.dialogs;

import java.awt.Container;

import javax.swing.JDialog;

import net.miginfocom.swing.MigLayout;
import pl.wroc.pwr.mss.logic.domain.Song;
import pl.wroc.pwr.mss.server.exceptions.PlaybackException;
import pl.wroc.pwr.mss.server.ui.ServerGui;
import pl.wroc.pwr.mss.server.ui.buttons.JClosePlaybackDialogButton;
import pl.wroc.pwr.mss.server.ui.buttons.JStartPlaybackButton;
import pl.wroc.pwr.mss.server.ui.buttons.JStopPlaybackButton;
import pl.wroc.pwr.mss.server.ui.labels.JPlaybackLabel;
import pl.wroc.pwr.mss.server.ui.sliders.JPlaybackSlider;
import pl.wroc.pwr.mss.server.util.SongPlayback;

/**
 * Okno dialogowe do odsluchiwania wybranego utworu. Kontrakt tej klasy wymaga,
 * aby najpierw dostarczyc do niej utwor metoda
 * {@link JSongPlaybackDialog#supplySong(Song)}, a dopiero pozniej uwidocznic
 * okno dialogowe.
 * 
 * @author mjagus
 */
public class JSongPlaybackDialog extends JDialog
{
    /**
     * Identyfikator klasy.
     */
    private static final long serialVersionUID = -6759153128933918299L;

    /**
     * Odtwarzacz strumienia audio. Dla kazdego utworu tworzony jest nowy.
     */
    private SongPlayback songPlayback;

    /**
     * Label pokazujacy aktualny czas odtwarzania utworu.
     */
    private JPlaybackLabel playbackLabel;

    /**
     * Slider graficznie pokazujacy czas odtwarzania utworu. Mozna za jego
     * pomoca rowniez ustawic moment od ktorego chcemy odtwarzac.
     */
    private JPlaybackSlider playbackSlider;

    /**
     * Rozpoczyna lub wznawia odtwarzanie utworu.
     */
    private JStartPlaybackButton startPlaybackButton;

    /**
     * Zatrzymuje odtwarzanie utworu.
     */
    private JStopPlaybackButton stopPlaybackButton;

    /**
     * Zamyka to okno dialogowe zatrzymujac takze odtwarzanie utworu.
     */
    private JClosePlaybackDialogButton closePlaybackDialogButton;

    /**
     * Iniciuje okno dialogowe.
     * 
     * @param gui Interfejs aplikacji serwerowej, ktory stanie sie parentnym
     * komponentem dla tego okna
     */
    public JSongPlaybackDialog(ServerGui gui)
    {
        super(gui);

        super.setSize(400, 120);
        super.setLocationRelativeTo(null);
        super.setModalityType(ModalityType.APPLICATION_MODAL);
        //FIXME: Zamknij odtwarzacz gdy uzytkownik zamknie okno dialogowe inaczej niz przez przycisk "Close"
        super.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    }

    /**
     * Iniciuje komponenty tego okna.
     */
    public void initComponents()
    {
        Container pane = super.getContentPane();
        pane.setLayout(new MigLayout());

        pane.add(playbackLabel, "wrap");
        pane.add(playbackSlider, "width 100%, span 3, wrap");
        pane.add(startPlaybackButton);
        pane.add(stopPlaybackButton);
        pane.add(closePlaybackDialogButton, "align right");
    }

    /**
     * Dostarcza utwor do tego okna dialogowego. Tworzy odpowiedni odtwarzacz
     * ktory bedzie pobieral strumien audio tego utworu.
     * 
     * @param song Dostarczany utwor
     * @throws PlaybackException W przypadku gdy nie mozna utworzyc odtwarzacza
     * audio dla tego utworu.
     */
    public void supplySong(Song song) throws PlaybackException
    {
        songPlayback = new SongPlayback(song);
        super.setTitle("Song playback: " + song.getArtist() + " - " + song.getTitle());
    }

    /**
     * @return Odtwarzacz strumienia audio
     */
    public SongPlayback getSongPlayback()
    {
        return songPlayback;
    }

    /**
     * @return Label pokazujacy aktualny czas odtwarzania utworu
     */
    public JPlaybackLabel getPlaybackLabel()
    {
        return playbackLabel;
    }

    /**
     * @param playbackLabel Label pokazujacy aktualny czas odtwarzania utworu
     */
    public void setPlaybackLabel(JPlaybackLabel playbackLabel)
    {
        this.playbackLabel = playbackLabel;
    }

    /**
     * @return Slider graficznie pokazujacy czas odtwarzania utworu
     */
    public JPlaybackSlider getPlaybackSlider()
    {
        return playbackSlider;
    }

    /**
     * @param playbackSlider Slider graficznie pokazujacy czas odtwarzania utworu
     */
    public void setPlaybackSlider(JPlaybackSlider playbackSlider)
    {
        this.playbackSlider = playbackSlider;
    }

    /**
     * @return Rozpoczyna lub wznawia odtwarzanie utworu
     */
    public JStartPlaybackButton getStartPlaybackButton()
    {
        return startPlaybackButton;
    }

    /**
     * @param startPlaybackButton Rozpoczyna lub wznawia odtwarzanie utworu
     */
    public void setStartPlaybackButton(JStartPlaybackButton startPlaybackButton)
    {
        this.startPlaybackButton = startPlaybackButton;
    }

    /**
     * @return Zatrzymuje odtwarzanie utworu
     */
    public JStopPlaybackButton getStopPlaybackButton()
    {
        return stopPlaybackButton;
    }

    /**
     * @param stopPlaybackButton Zatrzymuje odtwarzanie utworu
     */
    public void setStopPlaybackButton(JStopPlaybackButton stopPlaybackButton)
    {
        this.stopPlaybackButton = stopPlaybackButton;
    }

    /**
     * @return Zamyka to okno dialogowe zatrzymujac takze odtwarzanie utworu
     */
    public JClosePlaybackDialogButton getClosePlaybackDialogButton()
    {
        return closePlaybackDialogButton;
    }

    /**
     * @param closePlaybackDialogButton Zamyka to okno dialogowe zatrzymujac
     * takze odtwarzanie utworu
     */
    public void setClosePlaybackDialogButton(JClosePlaybackDialogButton closePlaybackDialogButton)
    {
        this.closePlaybackDialogButton = closePlaybackDialogButton;
    }
}
